package ar.com.ctrln.view.dashboard.compras.compra;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.EventQueue;
import org.zkoss.zk.ui.event.EventQueues;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Div;
import org.zkoss.zul.Label;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Window;

import ar.com.ctrln.control.compras.compra.ConsultarCompra;
import ar.com.ctrln.persistence.model.compra.Compra;
import ar.com.ctrln.persistence.model.compra.DetalleCompra;
import ar.com.ctrln.persistence.model.insumo.Insumo;
import ar.com.ctrln.view.ui.comportamientoVentana.AbstractMinimizarVentana;

@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class RecepcionCompraController extends AbstractMinimizarVentana {

	private static final long serialVersionUID = 7729776081089431884L;

	@WireVariable
	private ConsultarCompra consultarCompra;

	@Wire
	private Window wRegistrarRecepcion;

	private EventQueue<Event> recep = EventQueues.lookup("sendReclamo",
			EventQueues.DESKTOP, true);

	Compra compra;

	double total;

	boolean pedidoFallido = false;

	ListModelList<DetalleCompra> model;

	@Wire
	private Listbox lbDetalles;

	@Wire
	private Label lFechaEstimadaArribo;

	@Wire
	private Label lFechaAlta;

	@Wire
	private Label lFechaArribo;

	@Wire
	private Label lProveedor;

	@Wire
	private Div btnRegistrarReciboCompra;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		Clients.showNotification(
				"Seleccione los lotes recibidos correctamente",
				Clients.NOTIFICATION_TYPE_INFO, lbDetalles, "end_center", 6000);

		SimpleDateFormat sdf = new SimpleDateFormat("dd MMM yyyy");
		compra = (Compra) Executions.getCurrent().getArg().get("data");
		compra.setFechaRecepReal(new Date());
		model = new ListModelList<DetalleCompra>(compra.getDetalles());
		model.setMultiple(true);
		lbDetalles.setModel(model);
		lbDetalles.setCheckmark(true);
		lFechaEstimadaArribo.setValue(sdf.format(compra
				.getFechaRecepTentativa()));
		lFechaAlta.setValue(sdf.format(compra.getFechaAlta()));
		lFechaArribo.setValue(sdf.format(compra.getFechaRecepReal()));
		lProveedor.setValue(compra.getProveedor().getRazonSocial());

		recep.subscribe(new EventListener<Event>() {
			public void onEvent(Event event) throws Exception {
				compra.setReclamo((String) event.getData());
				compra.setEstado(Compra.ESTADO_ENRECLAMO);
				cerrarRecepcion();

			}
		});
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Listen("onClick = #btnRegistrarReciboCompra")
	public void registrarRecepcion() {
		Insumo insumo;
		for (DetalleCompra det : model.getSelection()) {
			det.setEstadoRecepcion(DetalleCompra.ESTADORECEPCION_CORRECTO);

			insumo = det.getInsumo();
			int actual = insumo.getStock();
			insumo.setStock(det.getCantidad() + actual);

			consultarCompra.actualizarInsumo(insumo);
			consultarCompra.actualizarDetalle(det);

		}

		for (DetalleCompra fail : model.getInnerList()) {
			if (fail.getEstadoRecepcion() == null) {
				fail.setEstadoRecepcion(DetalleCompra.ESTADORECEPCION_INCORRECTO);
				consultarCompra.actualizarDetalle(fail);
				pedidoFallido = true;
			}
		}

		if (pedidoFallido) {
			Messagebox.show("Desea enviar un reclamo al proveedor?",
					"Enviar Reclamo", Messagebox.YES | Messagebox.NO,
					Messagebox.QUESTION, new EventListener() {
						public void onEvent(Event evt) {
							switch (((Integer) evt.getData()).intValue()) {
							case Messagebox.YES:
								doYes();
								break;
							}
						}
					});
		} else {
			compra.setEstado(Compra.ESTADO_RECIVIDA);
			cerrarRecepcion();
		}

	}

	public void doYes() {
		Executions.createComponents(
				"/zul/compras/compras/registrarReclamo.zul",
				wRegistrarRecepcion, null);
	}

	public void cerrarRecepcion() {
		consultarCompra.actualizarCompra(compra);
		EventQueue<Event> eq = EventQueues.lookup("actualizarListaCompras",
				EventQueues.DESKTOP, false);

		eq.publish(new Event("onButtonClick", btnRegistrarReciboCompra, null));

		wRegistrarRecepcion.onClose();
		Clients.showNotification(
				"Las areas correspondientes seran notificadas sobre la actualizacion en insumos",
				Clients.NOTIFICATION_TYPE_INFO, null, "middle_center", 3500);
	}
}
